package com.example.zhidingyiview;

import android.content.Context;
import android.graphics.Canvas;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;



public class MyView extends View {
    String TAG = "MyView";
    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    //measure方法是final修饰的,不能复写
    //Measure测量一个View的大小 （onMeasure）

    /**
     * widthMeasureSpec:由两部分组成: 大小,测量模式
     * @param widthMeasureSpec 宽度方向父容器对子view的期望
     * @param heightMeasureSpec 高度方向父容器对子view的期望
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //EXACTLY:精确值模式 1 << MODE_SHIFT ，当控件的layout_width属性或layout_height属性指定为具体数值时，例如android:layout_width="100dp"，或者指定为match_parent属性时，系统使用的是EXACTLY 模式。
        //AT_MOST:最大模式 2 << MODE_SHIFT;,为warp_content时，控件大小一般随着控件的子控件或者内容的变化而变化
        //UNSPECIFIED:未定义的  0 << MODE_SHIFT
        //MeasureSpec.EXACTLY
        //大小
        int size = MeasureSpec.getSize(widthMeasureSpec);
        int mode = MeasureSpec.getMode(widthMeasureSpec);
        //mode: 1,size:900
        //px = dp * dpi / 160
        //dpi:屏幕像素密度 px/inch
        Log.d(TAG, "mode: "+(mode>>30)+",size:"+size);
    }

    //Layout摆放一个View的位置 （onLayout）
    //开发一般不复写layout,复写onLayout()
    @Override
    public void layout(int l, int t, int r, int b) {
        super.layout(l, t, r, b);
        Log.d(TAG, "layout: ");
    }

    //Draw画出View的显示内容 （onDraw）
    ////开发一般不复写draw,复写onDraw()
    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);
        Log.d(TAG, "draw: ");
    }
}
